package com.itheima.stock.service;

import com.itheima.stock.pojo.domain.PermissionsTreeDomain;
import com.itheima.stock.pojo.domain.UserAddDomain;
import com.itheima.stock.pojo.domain.UserRoleDomain;
import com.itheima.stock.pojo.entity.SysPermission;
import com.itheima.stock.pojo.entity.SysRole;
import com.itheima.stock.pojo.entity.SysUser;
import com.itheima.stock.pojo.vo.PermissionAddVo;
import com.itheima.stock.pojo.vo.PermissionUpdateVo;
import com.itheima.stock.pojo.vo.UserRolesUpdateInfo;
import com.itheima.stock.vo.req.AddRoleVo;
import com.itheima.stock.vo.req.LoginReqVo;
import com.itheima.stock.vo.req.UpdateRoleVo;
import com.itheima.stock.vo.resp.LoginRespExpandVo;
import com.itheima.stock.vo.resp.LoginRespVo;
import com.itheima.stock.vo.resp.PageResult;
import com.itheima.stock.pojo.vo.PermissionTreeNode;
import com.itheima.stock.vo.resp.R;

import java.util.Date;
import java.util.List;
import java.util.Map;

public interface UserService {

    /**
     * 根据用户名称查询用户信息
     * @param userName
     * @return
     */
    SysUser findByUserName(String userName);

    /**
     * 用户登录功能
     * @param vo
     * @return
     */
    R<LoginRespExpandVo> login(LoginReqVo vo);

    /**
     * 生成图片验证码功能
     * @return
     */
    R<Map> getCaptchaCode();

    /**
     * 多条件综合查询用户分页信息
     * @param page
     * @param pageSize
     * @param userName
     * @param nickName
     * @param startTime
     * @param endTime
     * @return
     */
    R<PageResult<SysUser>> getUserInfoByPage(Integer page, Integer pageSize, String userName, String nickName, Date startTime, Date endTime);

    /**
     * 添加用户信息
     * @param userAddDomain
     * @return
     */
    R<String> addUser(UserAddDomain userAddDomain);


    /**
     * 获取用户具有的角色信息，以及所有角色信息
     * @param id
     * @return
     */
    R<UserRoleDomain> getUserRoleInfo(String id);

    /**
     * 更新用户角色信息
     * @param userRolesUpdateInfo
     * @return
     */
    R<String> updateUserRole(UserRolesUpdateInfo userRolesUpdateInfo);

    /**
     * 批量删除用户信息
     * @param userIds
     * @return
     */
    R<String> deleteUserByIds(List<Long> userIds);

    /**
     * 根据用户id查询用户信息
     */
    R<SysUser> getUserInfo(Long userId);

    /**
     * 根据id更新用户基本信息
     */
    R<String> updateUserById(SysUser sysUser);

    /**
     * 分页查询当前角色信息
     * @param page
     * @param pageSize
     * @return
     */
    R<PageResult<SysRole>> queryRolesByPage(Integer page, Integer pageSize);

    /**
     * 树状结构回显权限集合,底层通过递归获取权限数据集合
     * @return
     */
    R<List<PermissionsTreeDomain> > getAllPermissions();

    /**
     * 添加角色和角色关联权限
     * @param addRoleVo
     * @return
     */
    R<String> addRoleConnection(AddRoleVo addRoleVo);

    /**
     * 根据角色id查找对应的权限id集合
     * @param id
     * @return
     */
    R<List<Long>> getRolePermission(Long id);

    /**
     * 更新角色信息，包含角色关联的权限信息
     * @param updateRoleVo
     * @return
     */
    R<String> updateRolePermission(UpdateRoleVo updateRoleVo);

    /**
     * 根据角色id删除角色信息
     * @param id
     * @return
     */
    R<String> deleteRoleById(Long id);

    /**
     * 更新用户状态
     * @param id
     * @param status
     * @return
     */
    R<String> updateUserStatus(Long id, Integer status);

    /**
     * 查询所有权限集合
     * @return
     */
    R<List<SysPermission>> getAllPermissionsNoOrder();

    /**
     * 查询所有权限的简略信息，以便以树状结构进行回显
     * @return
     */
    R<List<PermissionTreeNode>> showPermissionTree();

    /**
     * 添加权限
     * @param vo
     * @return
     */
    R<String> addPermission(PermissionAddVo vo);

    /**
     * 更新权限
     * @param vo
     * @return
     */
    R<String> updatePermission(PermissionUpdateVo vo);

    /**
     * 根据id删除权限
     * @param id
     * @return
     */
    R<String> deletePermissionById(Long id);
}
